import { JKManager } from "../JKManager";

let AudioKey = {
    Bgm: `BGM`,
}

type AudioConfig = {
    isMusicOn: boolean,
    isEffectOn: boolean,
}

/**
 * 音频管理器单例
 */
export class AudioManager {
    readonly AudioKey = AudioKey
    /**
     * 音频配置
     */
    private _audioConfig: AudioConfig;
    private _clipFolderPath: string;
    /**
     * 是否开启音乐
     */
    get isMusicOn() {
        return this._audioConfig.isMusicOn
    }
    set isMusicOn(isMusicOn) {
        this._audioConfig.isMusicOn = isMusicOn
    }
    /**
     * 是否开启音效
     */
    get isEffectOn() {
        return this._audioConfig.isEffectOn
    }
    set isEffectOn(isEffectOn) {
        this._audioConfig.isEffectOn = isEffectOn
    }

    /**
     * 初始化
     */
    init(clipFolderPath: string = `Audio`) {
        cc.log(`${cc.js.getClassName(this)} init clipFolderPath = ${clipFolderPath}`)

        this._clipFolderPath = clipFolderPath
        this._audioConfig = JKManager.LocalStorage.getData<AudioConfig>(JKManager.LocalStorage.LocalStorageKey.AudioConfig) || {
            isMusicOn: true,
            isEffectOn: true,
        }
        this.isMusicOn = this._audioConfig.isMusicOn
        this.isEffectOn = this._audioConfig.isEffectOn
    }

    //==============================================================================================================================
    //========================================================= 内部方法 ============================================================
    //==============================================================================================================================

    //==============================================================================================================================
    //========================================================= 外部方法 ============================================================
    //==============================================================================================================================

    /**
     * 播放音乐
     * @param audioKey 音频资源名
     * @param isLoop 是否循环播放，默认是
     * @param volume 音量，0 ~ 1，默认1
     */
    playMusic(audioKey: string, isLoop: boolean = true, volume = 1) {
        cc.log(`${cc.js.getClassName(this)} playMusic audioKey = ${audioKey} isLoop = ${isLoop} volume = ${volume}`)

        if (this.isMusicOn) {
            cc.loader.loadRes(`${this._clipFolderPath}/${audioKey}`, cc.AudioClip, (err, clip: cc.AudioClip) => {
                if (err) {
                    cc.error(`${cc.js.getClassName(this)} playMusic ${err}`)
                } else {
                    cc.audioEngine.playMusic(clip, isLoop)
                    cc.audioEngine.setMusicVolume(volume)
                }
            })
        }
    }

    /**
     * 停止播放音乐
     */
    stopMusic() {
        cc.log(`${cc.js.getClassName(this)} stopMusic`)

        cc.audioEngine.stopMusic()
    }

    /**
     * 播放音效
     * @param audioKey 音频资源名
     * @param isLoop 是否循环播放，默认否
     * @param volume 音量，0 ~ 1，默认1
     */
    playEffect(audioKey: string, isLoop: boolean = false, volume = 1) {
        cc.log(`${cc.js.getClassName(this)} playEffect audioKey = ${audioKey} isLoop = ${isLoop} volume = ${volume}`)

        if (this.isEffectOn) {
            cc.loader.loadRes(`${this._clipFolderPath}/${audioKey}`, cc.AudioClip, (err, clip: cc.AudioClip) => {
                if (err) {
                    cc.error(`${cc.js.getClassName(this)} playEffect ${err}`)
                } else {
                    cc.audioEngine.playEffect(clip, isLoop)
                    cc.audioEngine.setEffectsVolume(volume)
                }
            })
        }
    }
}